package com.lx.partitionsum;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

import java.util.Collection;
import java.util.HashMap;
import java.util.Optional;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: chenjiang
 * @Date: 2021/11/18/18:27
 * @Description:
 */
public class SatatePartition extends Partitioner<Text, Text> {

    private static final HashMap<String, Integer> stateMap = new HashMap<>();

    //TODO 模拟数据字典  实际开发中从Redis中获取
    static {
        stateMap.put("Alabama", 0);
        stateMap.put("Arkansas", 1);
        stateMap.put("California", 2);
        stateMap.put("Florida", 3);
        stateMap.put("Indiana", 4);
    }

    /**
     * <br>
     * 自定义分区 分区中的规则实现方法是 只要getPartition 返回的Int是一样 数据就会分到同一个风区中
     * 同一个分区值得其实就是数据到同一个RedueceTask处理
     * Hadoop MapReduce 默认的分区是 key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
     * {@link org.apache.hadoop.mapreduce.lib.partition.HashPartitioner#getPartition(Object, Object, int)}
     * </br>
     *
     * @param key   输入的key
     * @param value 文本数据
     * @desc: TODO 5 号分区 数据空
     */
    @Override
    public int getPartition(Text key, Text value, int i) {
        return stateMap.getOrDefault(key.toString(), 5);
    }
}
